package java_thinking.unit_15;

/**
 * @Description : 不用LinkedList,实现自己的内部链式存储机制
 * java_thinking.net.mindview.util.Stack 原实现
 *
 * 泛型方法指导原则：无论何时，只要你能做到，你就应该精良使用泛型方法，也就是说，如果使用泛型方法可以取代整个类的泛型化
 * 那么就应该只使用泛型方法，因为它可以使事情更清楚明白，另外，对于一个static的方法而言，无法访问泛型的类型参数，所以，
 * 如果static方法需要使用泛型的能力，就必须使其成为泛型的方法
 * @author: cww
 * @DateTime: 2019/4/1 19:46
 */

class LinkedStack<T> {
    private static class Node<U> {
        U item;
        Node<U> next;
        Node(){
            item = null;
            next = null;
        }
        Node(U item,Node<U> next){
            this.item = item;
            this.next = next;
        }
        boolean end() {
            return item == null && next == null;
        }
    }
    private Node<T> top = new Node<>();
    public void push(T item) {
        /**
         * 这里巧妙的就是new Node<T>(item,top);中的top就是当前未进行push前最顶端的Node对象，
         *  现在push新的，原处于首位的变为next
         */
        top = new Node<>(item,top);
    }

    /**
     * 弹出top(取出并删除)
     * @return
     */
    public T pop() {
        T result = top.item;
        if (!top.end()){
            top = top.next;
        }
        return result;
    }

    public static void main(String[] args) {
        LinkedStack1<String> linkedStack = new LinkedStack1<>();
        for (String s:"Sometimes the truth may be held in a handful of persons' hands".split(" ")){
            linkedStack.push(s);
        }
        String s;
        while (( s = linkedStack.pop())!=null){
            System.out.println(s);
        }
    }
}

class LinkedStack1<T> {
    private class Node {
        T item;
        Node next;
        Node() { item = null; next = null; }
        Node(T item, Node next) {
            this.item = item;
            this.next = next;
        }
        boolean end() { return item == null && next == null; }
    }
    private Node top = new Node(); // End sentinel
    public void push(T item) { top = new Node(item, top); }
    public T pop() {
        T result = top.item;
        if(!top.end())
            top = top.next;
        return result;
    }
}
